树状数组的本质思想是使用树结构维护”前缀和”，从而把时间复杂度降为O(logn)

//返回非负整数x在二进制表示下最低位1及其后面的0构成的数值
int lowbit(int x)
{
    return x & -x;
}

//将序列中第x个数加上k。
void add(int x, int k)
{
    for(int i = x; i <= n; i += lowbit(i)) tr[i] += k;
}

//查询序列前x个数的和
int ask(int x)
{
    int sum = 0;
    for(int i = x; i; i -= lowbit(i)) sum += tr[i];
    return sum;
}

// 求逆序对
for(int i = n; i >= 1; i --)//从后往前遍历，可以寻找在他之后的小于他的数
{
    int x = arr[i];
    ans += ask(x - 1);//查找1 - x-1的数的出现总的次数
    add(x,1);//x的出现次数加一
}